package main

import (
	"fmt"
	"math"
)

/**
- go语言没有说要求要常量大写，跟普通变量一样声明即可，go语言首字母大写是public是有意义的，后续会讲到
- const 数值可作为各种类型使用，所以下面声明了a和b为3，4，它并没有当作int，而是自己会当作float来使用
*/
func consts() {
	//const filename string = "abc.txt"
	//const filename = "abc.txt"
	//const a, b = 3, 4 // 不说a和b是int，在下方Sqrt的时候会自动认为是float64文本，就不用强制转换了
	// 可以以const()定义一组常量，来节省一下代码量
	const (
		filename = "abc.txt"
		a, b     = 3, 4
	)
	var c int
	c = int(math.Sqrt(a*a + b*b))
	fmt.Println(filename, c)
}

/**
- go语言的常量枚举
*/
func enums() {
	// 这样一组const就可以当作枚举来使用
	//const (
	//	cpp    = 0
	//	java   = 1
	//	python = 2-基本语法
	//	golang = 3
	//)
	// 但是go语言为定义一组const方法做了一个简化，使用iota，表示这组const是自增值的
	const (
		cpp = iota
		//java
		_
		python
		golang
		javascript
	)
	// _ 表示缺省，丢掉
	fmt.Println(cpp, javascript, python, golang)

	/**
	更复杂的用法
	*/
	const (
		b = 1 << (10 * iota)
		kb
		mb
		gb
		tb
		pb
	)
	fmt.Println(b, kb, mb, gb, tb, pb) // 1 1024 1048576 1073741824 1099511627776 1125899906842624

	/**
	总结：
	- golang语言中使用const块中的iota来实现自增值
	- 分：普通枚举类型，自增枚举类型
	*/
}

func main() {
	consts()
	enums()
}

/**
变量定义要点回顾：
- 变量类型写在变量名之后
- 编译器可推测变量类型
- 没有char，只有rune，而且rune还是32位的，关于它怎么用后续会讲到
- 原生地就支持复数类型，复数类型为complex
*/
